#ifndef CAMINO_H_
#define CAMINO_H_

#include "Contenido.h"
#include "Bonus.h"

using namespace std;

class Camino: public Contenido{

	private:
		Bonus* bonus;

	public:
		Camino(int fila, int columna){
			Camino::Camino();
			this->setPosicion(fila,columna);
			this->bonus = 0;
		}

		Camino(){
			this->setTextura('.');
			this->bonus = 0;

		}

		Bonus* getBonus(){

			return this->bonus;
		}

		void setPosicion(int fila, int columna){
			Contenido::setPosicion(fila,columna);
			if(this->bonus)
				this->bonus->setPosicion(this->getFila(),this->getColumna());
		}

		void setBonus(Bonus* bonus){

			this->bonus = bonus;
		}

		void imprimir(){
			
			string* pathTextura ;

			if(!this->hayCaminoVecino()){
				pathTextura = new string("img/punto.bmp");
			}else{
				if(hayCaminoAlCostado() && !hayCaminoArribaOAbajo()){
					pathTextura = new string("img/izquierda-derecha.bmp");
				}else{
					if(hayCaminoCuatroLados()){
						pathTextura = new string("img/todas-dirrecciones.bmp");
					}else if(hayCaminoArribaYIzquierda() && hayCaminoArribaYDerecha()){
						pathTextura = new string("img/izquierda-arriba-derecha.bmp");
					}else if(hayCaminoAbajoYIzquierda() && hayCaminoAbajoYDerecha()){
						pathTextura = new string("img/izquierda-abajo-derecha.bmp");
					}else if(hayCaminoAbajoYIzquierda() && hayCaminoAbajoYDerecha()){
						pathTextura = new string("img/izquierda-abajo-derecha.bmp");
					}else if(hayCaminoAbajoYDerecha() && hayCaminoArriba()){
						pathTextura = new string("img/arriba-derecha-abajo.bmp");
					}else if(hayCaminoAbajoYIzquierda() && hayCaminoArriba()){
						pathTextura = new string("img/izquierda-arriba-abajo.bmp");
					}else if(hayCaminoArribaYIzquierda()){
						pathTextura = new string("img/izquierda-arriba.bmp");
					}else if(hayCaminoArribaYDerecha()){
						pathTextura = new string("img/derecha-arriba.bmp");
					}else if(hayCaminoAbajoYIzquierda()){
						pathTextura = new string("img/izquierda-abajo.bmp");
					}else if(hayCaminoAbajoYDerecha()){
						pathTextura = new string("img/derecha-abajo.bmp");
					}else if(hayCaminoArriba() || hayCaminoAbajo()){
						pathTextura = new string("img/arriba-abajo.bmp");
					}else{
						pathTextura = new string("img/todas-dirrecciones.bmp");	
					}
					
				}
			}
			
			resolverTextura((*pathTextura));
			if(this->bonus){
				this->bonus->imprimir();
			}

		}

		bool esCamino(){
			return true;
		}

		void imprimir2(){
			if(this->bonus != NULL){
				this->bonus->imprimir2();
			}else{
				if(!this->hayCaminoVecino()){
					cout << ". ";
				}else{
					if(hayCaminoAlCostado() && !hayCaminoArribaOAbajo()){
						cout << "- ";
					}else{
						if(!hayCaminoAlCostado() && hayCaminoArribaOAbajo()){
							cout << "| ";
						}else{
							cout << "+ ";
						}
					}
				}
			}
		}

		~Camino(){
		
			if(this->bonus)
				delete bonus;
		}

	private:
		
		bool hayCaminoEnLaCasilla(int fila, int columna){
			Casillero* casilla = NULL;
			try{
				casilla = Escenario::getInstance()->getGrilla()->getCasillero(fila, columna );
			}catch(PositionOutOfBoundException* e){
				delete e;
				return false;
			}
			if((casilla->getContenido())&&(casilla->getContenido()->esCamino()))
				return true;
			return false;
		}
		
		bool hayCaminoAlCostado(){
			return hayCaminoIzquierda() || hayCaminoDerecha() ;
		}

		bool hayCaminoArribaOAbajo(){
			return hayCaminoArriba() ||hayCaminoAbajo();
		}

		bool hayCaminoVecino(){
			return hayCaminoArriba () || hayCaminoAbajo() || hayCaminoIzquierda() || hayCaminoDerecha();
		}

		bool hayCaminoArribaYIzquierda(){
			return hayCaminoArriba() && hayCaminoIzquierda();
		}

		bool hayCaminoArribaYDerecha(){
			return hayCaminoArriba() && hayCaminoDerecha() ;
		}

		bool hayCaminoAbajoYIzquierda(){
			return hayCaminoAbajo() && hayCaminoIzquierda();
		}

		bool hayCaminoAbajoYDerecha(){
			return hayCaminoAbajo() && hayCaminoDerecha();
		}

		bool hayCaminoCuatroLados(){
			return (hayCaminoArriba() && hayCaminoAbajo() && hayCaminoDerecha() && hayCaminoIzquierda());
			
		}

		bool hayCaminoAbajo(){
			return hayCaminoEnLaCasilla(this->getFila()+1, this->getColumna());
		}
		bool hayCaminoArriba(){
			return hayCaminoEnLaCasilla(this->getFila()-1, this->getColumna());
		}
		bool hayCaminoIzquierda(){
			return hayCaminoEnLaCasilla(this->getFila(), this->getColumna()-1);
		}
		bool hayCaminoDerecha(){
			return hayCaminoEnLaCasilla(this->getFila(), this->getColumna()+1);
		}


};

#endif